<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    /* 函数封装过程,形参对应接收实参(实际参数可以是各种类型的数据) */
    /* function fn(a){
        console.log(a);
    }

    fn(10);
    fn("hello");
    fn(true);
    fn(null);
    fn(undefined);
    fn([1,2,3]);
    fn({a:1,b:2});
    fn(function(){
        console.log("我是传入的函数");
    }) */



    // 回调函数(callback)  => 把函数当成参数(实际参数)传入到另一个函数中,让它在另一个函数中执行 (简单的来说:传入的函数并没有立即执行,而是需要在接收的函数内调用才会执行)
    // function fn(a){ // 形参a接收传入的函数(函数是一个特殊的对象 -> 引用类型,形参和传入的函数引用同一片内存地址, 通过形参调用函数等价于直接调用函数 )
    //     // var a = function(){
    //     //     console.log("我是传入的函数");
    //     // }

    //     console.log(a); 
    //     a();
    // }

    // fn(function(){
    //     console.log("我是传入的函数");
    // }) 



    // 回调的作用: 可以让用户自行决定在另一个函数中执行什么内容(提前决定好要执行的内容,让它在另一个函数中执行  => 锦囊妙计)
    
    function sum(a,b){
        return a + b;
    }

    function reduce(a,b){
        return a - b;
    }

    function multip(a,b){
        return a * b;
    }

    function division(a,b){
        return a / b;
    }

    function mod(a,b){
        return a % b;
    }

    // var result = sum(10,3);
    // console.log(result);

    // var result = division(10,3);
    // console.log(result);

    // callback  => 传入的函数(计算的方式 加减乘除)
    // a b    => 参数计算的两个数
    function calc(callback,a,b){
        console.log("callback",callback); // callback = sum
        return callback(a,b);
    }

    var result = calc(sum,10,3);  
    console.log(result);
    var result = calc(reduce,10,3);  
    console.log(result);
    var result = calc(multip,10,3);  
    console.log(result);


    var result = calc(function(a,b){
        return a**b;  // a^b
    },10,3);  
    console.log(result);











</script>
</html>